// 1. 以前通过规范__xxx来定义私有属性，但是不推荐使用,如vue2中很多__xx实例属性
// 2. 通过symbol定义私有属性,但是缺点是外面可以通过getOwnPropertySymbols获取到
// 3. 通过WeakMap定义私有属性，管理私有属性，但是代码写的很丑
// 4. 通过官方的 #xx 定义，兼容性要注意--推荐
// 5. 通过闭包

// 1
export class A {
    __name = '张三'
    sayName() {
        console.log(this.__name)
    }
}

// 2. symbol

const f=  Symbol('f')
export class privateBySymbol {
    constructor() {
        this[f] = '私有属性--symbol'
    }
  get f() {
      return this[f]
  }
}

// 3. WeakMap

 const privateMap = new WeakMap()
 export class privateByWeakMap {
      constructor(){
        privateMap.set(this, {
            name:'私有字段--map'
        })
      }

      get name() {
        return privateMap.get(this).name
      }
      set name(value) {
        privateMap.get(this).name = value
      }
 }

 // 4. #

 export class privateByHash {
    #privateName = '私有属性--hash'
    get privateName() {
        return this.#privateName
    }
    set privateName(value) {
        this.#privateName = value
    }
}

// 5. 闭包

export function privateByClosure() {
    let privateName = '私有属性--闭包'

    return {
        get privateName() {
            return privateName
        },
        set privateName(value) {
            privateName = value
        }
    }
}


export default {
    A,
    privateBySymbol,
    privateByWeakMap,
    privateByHash,
    privateByClosure

}